package risoe.syslab.fhnew.gui;

/*
 * Copyright (c) 2012-2014, Technical University of Denmark (DTU)
 * All rights reserved.
 * 
 * The Flexhouse 2.0 platform ("this software") is licensed under the
 * BSD 3-clause license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   - Neither the name of DTU nor the names of its contributors may be used to
 *     endorse or promote products derived from this software without specific
 *     prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE TECHNICAL UNIVERSITY OF DENMARK BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.awt.Point;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.io.Serializable;

/**
 * Class representing a GUI event (mouse click etc.)
 * @author M. Svendsen
 */
public class VisualizationEvent implements Serializable{
	private static final long serialVersionUID = -9059139530672004383L;

	// Supported events
	public static enum EventType{
		Mouse_Click, Mouse_Drag, Mouse_Release, Mouse_Pressed, Unknown;
	}

	private final EventType mType;
	private final String mDestination;
	private final Point mPoint;
	private final String mId;

	/**
	 * Constructs a new VisualizationEvent from an InputEvent and destination
	 * @param e the InputEvent to utilize
	 * @param destination the name of the controller to which this event should be sent
	 */
	public VisualizationEvent(InputEvent e, String destination) {
		mDestination = destination;
		mType = getEventType(e.paramString());
		mPoint = ((MouseEvent)e).getPoint();
		mId = "Unknown";
	}
	
	/**
	 * Constructs a new VisualizationEvent from a Point, an id and a destination
	 * @param p the Point of the event
	 * @param type the type of mouse event
	 * @param id the ID of the object that was clicked 
	 * @param destination the name of the controller to which this event should be sent
	 */
	public VisualizationEvent(Point p, EventType type, String id, String destination) {
		mDestination = destination;
		mType = type;
		mPoint = p;
		mId = id;
	}

	/**
	 * Convenience method to get the correct EventType based on an InputEvent
	 * @param contents a String of parameters obtained from an InputEvent by calling
	 * inputEvent.paramString()
	 * @return the EventType related to the InputEvent
	 */
	private EventType getEventType(String contents){
		// Parse type
		if (contents.contains("MOUSE_CLICKED")){
			return EventType.Mouse_Click;
		}
		else if (contents.contains("MOUSE_DRAGGED")){
			return EventType.Mouse_Drag;
		}
		else if (contents.contains("MOUSE_RELEASED")){
			return EventType.Mouse_Release;
		}
		else if (contents.contains("MOUSE_PRESSED")){
			return EventType.Mouse_Pressed;
		}
		else{
			return EventType.Unknown;
		}
	}
	
	/**
	 * @return a String representing the destination(name) of the controller
	 * associated with the origin of this VisualizationEvent
	 */
	public String getDestination(){
		return mDestination;
	}
	
	/**
	 * @return the type of event
	 */
	public EventType getEventType(){
		return mType;
	}
	
	/**
	 * @return a Point describing the location of the event on screen
	 */
	public Point getPoint(){
		return mPoint;
	}
	
	/**
	 * This function can be used to return the ID of the object for which a listener
	 * was previously registered. If this event is unrelated to such an object, this function
	 * will simply return "Unknown"
	 * @return the ID of the object that was clicked.
	 */
	public String getID() {
		return mId;
	}
}
